#define _CRT_SECURE_NO_WARNINGS 1
#include"date.h"


void Date::Print() const
{
	cout << _year << "/" << _month << "/" << _day << endl;
}

bool Date::operator==(const Date& d) const
{
	return _year == d._year
		&& _month == d._month
		&& _day == d._day;
}

bool Date::operator!=(const Date& d) const
{
	/*return _year != d._year
		|| _month != d._month
		|| _day != d._day;*/

	return !(*this == d);

}

bool Date::operator>(const Date& d) const
{
	if (_year > d._year
		|| ((_year > d._year) && (_month > d._month))
		|| (((_year > d._year) && (_month > d._month)) && (_day > d._day)))
	{
		return true;
	}
	else
	{
		return false;
	}
}

bool Date::operator>=(const Date& d) const
{
	return ((*this > d) || (*this == d));
}


bool Date::operator<(const Date& d) const
{
	return !(*this >= d);
}


bool Date::operator<=(const Date& d) const
{
	return (*this < d) || (*this == d);
}


Date Date::operator+(int day) const
{
	Date ret = *this;
	ret += day;

	return ret;
}


Date& Date::operator+=(int day)
{
	if (day < 0)
	{
		return *this -= -day;
	}

	_day += day;
	while (_day > GetMonthDay(_year, _month))
	{
		_day -= GetMonthDay(_year, _month);
		++_month;
		if (_month == 13)
		{
			_month = 1;
			_year++;
		}
	}

	return *this;
}


Date& Date::operator++()
{
	return *this += 1;
}


Date Date::operator++(int)
{
	Date tmp(*this);
	tmp += 1;
	return tmp;
}


Date Date::operator-(int day) const
{
	Date tmp(*this);
	tmp -= day;

	return tmp;
}


Date& Date::operator-=(int day)
{
	if (day < 0)
	{
		return *this += -day;
	}

	_day -= day;
	while (_day <= 0)
	{
		--_month;
		if (_month == 0)
		{
			_year--;
			_month = 1;
		}

		_day += GetMonthDay(_year, _month);
	}

	return *this;
}


Date& Date::operator--()
{
	return *this -= 1;
}


Date Date::operator--(int)
{
	Date tmp(*this);
	tmp -= 1;
	return tmp;
}

int Date::operator-(const Date& d) const
{
	int flag = 1;
	Date max = *this;
	Date min = d;
	if (*this < d)
	{
		max = d;
		min = *this;
		flag = -1;
	}

	int n = 0;
	while (min != max)
	{
		++min;
		++n;
	}

	return n * flag;
}